/**
 * @file Acceptor.hpp
 * @brief TCP连接接受器类的声明
 * @details 封装了服务器端的监听socket，负责接受客户端连接请求
 */

#ifndef __Acceptor_H__
#define __Acceptor_H__
#include "InetAddress.hpp"
#include "Socket.hpp"

namespace wd
{

/**
 * @class Acceptor
 * @brief TCP连接接受器
 * @details 封装了TCP服务器的监听功能，包括socket的创建、绑定、监听和接受连接
 */
class Acceptor
{
public:
    /**
     * @brief 构造函数
     * @param port 监听端口号
     * @param ip 监听的IP地址，默认为127.0.0.1
     */
    Acceptor(unsigned short port, const string & ip = "127.0.0.1");

    /**
     * @brief 准备监听socket
     * @details 设置socket选项、绑定地址并开始监听
     */
    void ready();
    
    /**
     * @brief 接受客户端连接
     * @return 新连接的文件描述符
     */
    int accept();
    
    /**
     * @brief 获取监听socket的文件描述符
     * @return 文件描述符
     */
    int fd() const {    return _sock.fd();  }

private:
    /**
     * @brief 设置地址重用选项
     * @param on true表示启用，false表示禁用
     */
    void setReuseAddr(bool);
    
    /**
     * @brief 设置端口重用选项
     * @param on true表示启用，false表示禁用
     */
    void setReusePort(bool);
    
    /**
     * @brief 绑定地址到socket
     */
    void bind();
    
    /**
     * @brief 开始监听连接
     */
    void listen();

private:
    InetAddress _addr;  ///< 监听地址
    Socket _sock;       ///< 监听socket
};

}//end of namespace wd


#endif

